/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.mala.util;

import br.jm.mala.entity.Modulos;
import br.jm.mala.entity.Roles;
import br.jm.mala.entity.User;
import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;

public class AutorizaListener implements PhaseListener {

    private static final long serialVersionUID = -8039790100423523041L;
    private User usuarioAutenticado;

    @Override
    public void afterPhase(PhaseEvent event) {
        FacesMessage msg = null;

        // Obtém o contexto atual
        FacesContext contexto = event.getFacesContext();
        // Obtém a página que atualmente está interagindo com o ciclo
        String paginaAtual = contexto.getViewRoot().getViewId();
        //paginaAtual = paginaAtual.replace("xhtml", "jsf");
        // Se for a página 'login.jsp' seta a variável como true
        boolean isLoginPage = paginaAtual.lastIndexOf("login.xhtml") > -1;
        // Obtém a sessão atual
        HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);
        // Restaga o nome do usuário logado

        try {
            usuarioAutenticado = (User) sessao.getAttribute("usuarioAutenticado");
        } catch (Exception ex) {
            usuarioAutenticado = null;
        }
        // Verifica se o usuário está logado e se não está na página de login
        if (!isLoginPage && usuarioAutenticado == null) {
            // Redireciona o fluxo para a página de login
            //NavigationHandler nh = contexto.getApplication().getNavigationHandler();
            //nh.handleNavigation(contexto, null, "sair");
            FacesContext faces = FacesContext.getCurrentInstance();
            ExternalContext context = faces.getExternalContext();
            try {
                context.redirect("/mala/index.jsp");
            } catch (IOException ex) {
                //Logger.getLogger(AutorizaListener.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (usuarioAutenticado != null && !verificaAcesso()) {
            // Se o usuário logado tentar acessar a página de login ele é
            // redirecionado para a página inicial
            boolean lPassa = false;
            for (int i = 0; i < usuarioAutenticado.getRoles().size(); i++) {
                Roles selectedRoles = usuarioAutenticado.getRoles().get(i);
                for (int j = 0; j < selectedRoles.getRolesModulosList().size(); j++) {
                    Modulos selectedRolesModulo = selectedRoles.getRolesModulosList().get(j);
                    String pagina = selectedRolesModulo.getDescription();
                    if ((pagina.compareTo(paginaAtual.replace("xhtml", "jsf")) == 0)) {
                        lPassa = true;
                        break;
                    }
                }
            }
            if (!lPassa) {
                FacesContext faces = FacesContext.getCurrentInstance();
                ExternalContext context = faces.getExternalContext();
                try {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, " ATENÇÃO ... USUÁRIO NÃO TEM DIREITO DE ACESSO A ESSA PAGINA!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);
                    context.redirect("/mala/index.jsp");
                } catch (IOException ex) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, " ATENÇÃO ... USUÁRIO NÃO TEM DIREITO DE ACESSO A ESSA PAGINA!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);
                }
            }
        }
    }

    @Override
    public void beforePhase(PhaseEvent event) {
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

    public boolean verificaAcesso() {
        boolean lReturn = false;
        for (int i = 0; i < usuarioAutenticado.getRoles().size(); i++) {
            if (usuarioAutenticado.getRoles().get(i).getDescription().equals("ROLE_ADMIN")) {
                lReturn = true;
                break;
            }
        }

        return lReturn;
    }
}
